#include "widget.h"

#include <QApplication>
//带参数的信号和槽函数
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
/*
 * 信号和槽本质都是函数，可以带参数
 * 当信号带有参数的时候，槽函数必须与信号带的参数一致
 * 此时发射信号的时候，就可以给信号函数传递参数，与之对应的这个参数就会被传递到对应的槽函数中了
 * 这样，就可以让信号给槽函数传递参数效果了
 *
 * 信号函数和槽函数的参数一致
 * 这里的一致主要是要求类型一致，对个数不做要求，个数不一致也可以
 * 当个数不一致时，要求 信号函数的参数的个数 > 槽函数参数的个数
 *
 * Qt中有很多内置信号，也有带参数的，这些参数都是可以自己进行传递
 * clicked信号函数重载了有参和无参两种版本
 * clicked(bool)这个bool类型的参数表示，当前按钮是否处于选中状态，
 * 这个选中状态对于QPushButton来说没啥意义，对于QCheckBox复选框就很有作用了
*/

/*
 * 信号函数的参数个数 > 槽函数的参数个数时，此时，是可以正常使用的
 * 但是，信号函数的参数个数 < 槽函数的参数个数 此时，是无法编译通过的
 * 原因：按道理来说，应该是信号函数的参数个数和槽函数的参数个数必须是类型个数严格一致的
 * 因为，槽函数可以绑定多个信号
 * 如果严格要求槽函数和信号函数的参数个数必须一致，那么，就意味着信号绑定到槽函数上的要求变高了，能够绑定到同一个槽函数上的信号就会变少
 * 如果，信号函数的参数个数 > 槽函数的参数个数，这样，就可以允许多个信号绑定同一个槽函数了
 * 信号函数和槽函数之间的绑定就更加灵活了
 * 更多的信号可以绑定到这个槽函数上了
 *
 * 槽函数和信号函数参数的个数不一致，槽函数就会按照参数顺序，拿到信号函数的所有参数，作为自己槽函数的前n个参数
 * 进而去通过该信号触发此槽函数的处理
 * 所以，要确保槽函数的每个参数都是有值的
 *
 * 要求信号函数给槽函数传递参数时，只多不少
 *
*/

/*
 * 带有参数的信号，要求信号的参数和槽函数的参数类型一致
 * 个数符合要求(信号函数的参数 >= 槽函数的参数)
 * Qt中的规定：在Qt中，如果要让某个类能够使用信号槽，
 * 即想在这个类中定义信号和槽函数，
 * 则必须在类最开始的地方，
 * 写上Q_OBJECT宏
 * 这个宏就会展开很多关于此类可以使用信号槽的代码
 *
 * 所以，在类中要定义/使用信号函数和槽函数时，要在此类最开始加上Q_OBJECT宏
*/


/*
 * 信号和槽存在的意义
 * 所谓的信号槽，终究要解决的问题，就是响应用户的操作
 * 信号槽，其实在GUI开发的各种框架中，是一个比较有特色的存在
 * 其他的GUI开发框架，搞得方式比较简洁
 * 例如：网页开发(js+dom api)
 * 网页开发中响应用户操作，主要就是挂回调函数
 * button onclick=handler;
 * function handler(){...}
 * 这种方式不需要单独的connect连接，就可以完成上述的信号槽连接
 * 处理函数就像控件的一个属性/成员一样
 * 大部分的GUI开发框架都是这么简介的设计的。
 * 这种是一对一的方式
 * 就是一个给一个控件绑定一个处理方法
 * 即一个事件(控件)只能对应一个处理函数
 * 一个处理函数也只能对应到一个事件上。
 *
 * 在Qt信号槽的设计中，connect连接这个机制相比上述就比较复杂，原因：
 * 1、解耦合：把触发用户操作的控件和处理对应用户的操作逻辑解耦合
 * 2、多对多 效果：一个信号，可以connect连接到多个槽函数上、一个信号槽可以被多个信号conncet连接
 *
 * 在Mysql中，设计数据库表结构时，就需要理清楚实体(对象、记录)和实体之间的关系
 * 实体就是对象，在mysql中也就是表中的记录，即对现实问题中的关键名词进行的抽象
 * 三种不同的关系(一对一、一对多、多对多)设计表的时候，就有不同的写法(定式)
 * Qt作为客户端，很少涉及到数据库，数据库主要还是用于后端
 *
 * Qt中谈到的，信号和槽的多对多，就和数据库表结构中的多对多，非常类似
 *
*/

/*
 * 在Qt中，信号和槽之间可以多对多
 * 即，多个信号可以连接同一个槽函数
 * 多个槽函数也可以被同一个信号所连接
 * Qt引入信号槽机制，最本质的目的：为了能够让信号和槽之间按照多对多的方式进行关联
 * 其他的GUI框架往往不具备这样的特性
 *
 * 实际上，随着程序开发过程中，其实在GUI开发过程中，多对多是一个伪需求。
 * 实际开发中很少用到多对多
 * 绝大部分情况下，一对一就够用了
 *
 * 新出的图形化开发框架就很少有继续支持多对多了
 *
*/
